﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 生成SKU
{
    internal class Program
    {
        // 测试 通过参数生成 SKU 货品
        static void Main(string[] args)
        {

            List<string> str1 = new List<string>
            {
                "白","黄","红","蓝"
            };
            List<string> str2 = new List<string>
            {
                "37","38","39","40"
            };
            List<string> str3 = new List<string>
            {
                "少女版","成人版","老人版"
            };
            //////生成sku 4*4*3=48//////////////
            /////一种版式
            Console.WriteLine("一种参数形式的SKU生成方式 start ");
            for (int i = 0; i < str1.Count; i++)
            {
               
                    Console.WriteLine(str1[i] + " ");
             
            }
            Console.WriteLine("一种参数形式的SKU生成方式 end ");
            /////两种版式
            Console.WriteLine("二种参数形式的SKU生成方式 start ");
            for (int i = 0; i < str1.Count; i++)
            {
                for (int j = 0; j < str2.Count; j++)
                {
                    Console.WriteLine(str1[i] + " " + str2[j]);
                }
            }
            Console.WriteLine("二种参数形式的SKU生成方式 end ");
            Console.WriteLine("===================================");
            /////三种版式
            Console.WriteLine("三种参数形式的SKU生成方式 start ");
            for (int i = 0; i < str1.Count; i++)
            {
                for (int j = 0; j < str2.Count; j++)
                {
                    for (int k = 0; k < str3.Count; k++)
                    {
                        Console.WriteLine(str1[i] + " " + str2[j] + " " + str3[k]);
                    }

                }
            }
            //四种版式。。。
            //五种版式。。。
            Console.WriteLine("三种参数形式的SKU生成方式 end ");
            // 4的阶乘=4*3*2*1    5的阶乘 =5*4*3*2*1
            Console.WriteLine(JSJC(3));
            Console.WriteLine(JSJC(4));
            Console.WriteLine( JSJC(5) );
            // 1,1,2,3,5,8,13,21 求数列的第几个
            Console.WriteLine(JS2(5));
            Console.WriteLine(JS2(10));
            //
            Console.WriteLine("使用递归生成start ");
            List<string> str4 = new List<string>() {"湖南","湖北" };
            List<List<string>> csLint = new List<List<string>> { str1, str2, str3,str4 };
            DHG("", 0, csLint[0], csLint);
            Console.WriteLine("使用递归生成end ");

            Console.ReadLine();
        }
        //递归算法讲解：了解程序设计中的递归算法
        //什么是递归算法？ 方法中调用方法自己。
        //递归算法特点：1.方法自己调用自己 2.需要设计一个退出点. 3.经典程序
        //求阶乘的方法
        public static int JSJC(int n)
        {
            if (n == 1)
            {
                return 1;
            }
            else {
                return n * JSJC(n - 1);
            }
        }

        public static int JS2(int n)
        {
            if (n == 1 || n == 2)
            {
                return 1;
            }
            else 
            {
                return JS2(n - 1) + JS2(n - 2);
            }
        }

        //生成SKU递归方法
        public static void DHG(string nn, int c, List<string> L, 
                List<List<string>> ooop )
        {
            c = c + 1;
            foreach (var value in L)
            {
                if (ooop.Count > c)
                {
                    var mm = nn + value;
                    DHG(mm, c, ooop[c], ooop); //这里用了递归？什么是递归？方法中调用方法本身，必须有一个退出功能
                }
                else
                {
                    Console.WriteLine(nn + value);
                }
            }
        }
    }
}
